package record

import (
	"encoding/binary"
	"hash/crc32"
)

// Header 记录的头信息
/*
crc uint32 4字节
keySize uint32 4字节
valueSize uint32 4字节
共计20字节，但是这里需要使用变长来节省空间，uint32的最大空间占用是5，所以应该是15个字节
*/
type Header struct {
	Crc       uint32
	KeySize   uint32
	ValueSize uint32
}

type Body struct {
	Key   []byte
	Value []byte
}

type Record struct {
	Header *Header
	Body   *Body
}


func NewRecord(key, value []byte) ([]byte, uint64) {
	// 计算key和value的size
	keySize := len(key)
	valueSize := len(value)

	// 初始化一个index
	index := 4
	// 开始计算Header部分
	header := make([]byte, 15)
	index += binary.PutVarint(header[index:], int64(keySize))
	index += binary.PutVarint(header[index:], int64(valueSize))

	// 开始计算key
	size := index + keySize + valueSize
	tmp := make([]byte, size)
	copy(tmp[:index], header[:index])
	copy(tmp[index:], key)
	index += keySize
	copy(tmp[index:], value)
	// 计算CRC
	crcValue := crc32.ChecksumIEEE(tmp[4:])
	binary.LittleEndian.AppendUint32(tmp[:4], crcValue)
	// 返回byte数组和记录的长度
	return nil, 0
}
